Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Creación y Manipulación de Filas con Punteros por el Método Circular Doblemente Ligado en Microsoft Visual C++ 2005 (página 2)




Enviado por jaimemontoya



Partes: 1, 2

Formulario y Objetos en Tiempo de
Diseño

Ejemplo del Programa en
Ejecución

Para comprender mejor el funcionamiento del programa, se
hará un ejemplo y se irán mostrando las pantallas
de ejecución:

Creando Fila:

Agregando un nodo al final de la fila:

Agregando un nodo en medio de los dos nodos
anteriormente creados (en la posición 2, pues "k" vale 2).
Esto significa que el nodo 2 pasará a ser el nodo 3 y que
se harán las conexiones respectivas de los
apuntadores:

Eliminando el nodo de la posición 1 (es decir
eliminando el "header"). Esto significa que el nuevo "header"
pasará a ser el nodo 2:

Para comprobar que las todo está trabajando
bien, se procede a navegar entre los nodos. Primeramente hacemos
clic en el botón "Ir al Primer Nodo de
Todos":

Debido a que se eliminó el "header"
anteriormente, nótese que el que era "un nodo intermedio"
(pues estaba en la posición 2, entre el nodo 1 ("header")
y el nodo 3 (último nodo de todos), ha pasado a ser
nuestro "header", pues es el primer nodo de todos.

Ahora hacemos clic en el botón "Ir al
Último Nodo de Todos:

Luego hacemos clic en el botón
Siguiente:

Estábamos en el nodo 2 (último nodo de
todos), y al hacer clic en el botón Siguiente, llegamos al
nodo 1 (primer nodo de todos o "header"). Este es el efecto de
trabajar con el Método
Circular Doblemente Ligado.

Ahora hacemos clic en el botón
Anterior:

Estábamos en el nodo 1 (primer nodo de todos o
"header"), y al hacer clic en el botón Anterior hemos
llegado al nodo 2 (que es el último nodo de todos). Este
es el efecto de trabajar con el Método Circular Doblemente
Ligado.

Código del Programa

Estando en tiempo de diseño,
hacemos doble clic al formulario y luego nos vamos a las primeras
líneas de código
que aparecen, e identificamos las siguientes líneas de
código que ya deben aparecer así
predeterminadamente:

using namespace System;

using namespace
System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

Justo abajo de las líneas anteriores, creamos
nuestra estructura y a
la vez declaramos una variable pública:

//Se crea una estructura
personalizada.

struct
nodo

{

int
edad;

double
salario;

char
nombreyapellidos[100];

nodo *siguiente, *anterior;//También se puede poner "struct nodo
*siguiente, *anterior;", pero no es necesario poner la palabra
"struct" al principio.

};

nodo *current, *temporary, *header;//Se inicializan 3 punteros del tipo "nodo", pues ya
"nodo" es un tipo de datos (por la
estructura recién creada), como decir "int", "char",
"float", etc. También se puede poner "struct nodo *p, *q,
*header;", pero no es necesario poner la palabra "struct" al
principio.

int
totaldenodos;//Para contar el
número total de nodos que hay. Esta variable llamada
"contador" es pública, pues no funcionará solamente
dentro de un objeto o evento de un botón en
específico, sino que en todo el programa.

Posteriormente se hace doble clic sobre cada
botón al que se le quiere asignar código para el
evento Click. Aparecerán comentarios en color verde a lo
largo de todo el código para explicar el funcionamiento y
la lógica
que se ha seguido en la creación de este programa. El
código completo para todos los botones es el
siguiente:

Código del Botón Crear
Fila

private: System::Void
button1_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Crear Fila".

totaldenodos=0;//Cuando se
le da clic al botón "Crear", la cuenta del número
total de nodos se reinicia (es decir vuelve a comenzar con cero
nodo como número total de nodos en la fila, aunque
aumentará a uno precisamente con el nodo que se
creará con el evento Click de este botón,
según lo programado con la línea
"totaldenodos+=1;").

//Se dertermina hacia dónde va a
apuntar la variable apuntadora llamada "header".

header = new
nodo;//Se le puede poner
"header = new struct nodo;", pero no es necesario poner la
palabra "struct".

//Con las próximas 6
líneas se llenan de información o datos los espacios de
memoria a los
que se encuentra apuntando el apuntador.

header->edad =
Convert::ToInt64(textBox1->Text);

header->salario =
Convert::ToDouble(textBox2->Text);

for(int i=0;i<100;i++)//Para llenar cada posición del arreglo de
espacios en blanco y que así imprima espacios en blanco en
vez de cualquier otra cosa en los espacios que sobren en el caso
que el nombre y apellidos tengan menos de 100 caracteres. Por
ejemplo si el nombre y apellidos ocupan 50 caracteres, los otros
50 se llenarán de espacios en blanco y eso no
afectará el programa porque el usuario no percibirá
ninguna diferencia visualmente.

header->nombreyapellidos[i]=' ';//En cada
iteración se llena una posición de un espacio en
blanco, de modo que luego de las 100 iteraciones del ciclo "for",
las 100 posiciones estarán llenas de espacios en
blanco.

//Con las próximas 2
líneas se llena cada posición del arreglo tipo
"char" con datos tomados del textBox3 y pasados de "String" a
"char".

for(int
i=0;i<textBox3->Text->Length;i++)

header->nombreyapellidos[i] =
textBox3->Text[i];

//Con las próximas 2
líneas se define que el apuntador del nodo recién
creado apunte a él mismo ya sea si se quiere navegar hacia
adelante o hacia atrás, debido a que el modelo con el
que se está trabajando es "Circular Doblemente
Ligado".

header->anterior = header;

header->siguiente = header;

current = header;//Para que
cuando se haga clic en el botón Anterior o Siguiente, se
sepa que el nodo recién creado es el "header" (primer nodo
de la fila).

totaldenodos+=1;//Le suma 1
al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}

Código del Botón Agregar Nodo al
Final

private: System::Void
button2_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Agregar Nodo al Final".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

//Se determina hacia dónde va a
apuntar la variable apuntadora llamada "current".

current = new
nodo;//Se le puede poner
"header = new struct nodo;", pero no es necesario poner la
palabra "struct".

//Con las próximas 6
líneas se llenan de información o datos los
espacios de memoria a los que se encuentra apuntando el
apuntador.

current->edad =
Convert::ToInt64(textBox1->Text);

current->salario =
Convert::ToDouble(textBox2->Text);

for(int i=0;i<100;i++)//Para llenar cada posición del arreglo de
espacios en blanco y que así imprima espacios en blanco en
vez de cualquier otra cosa en los espacios que sobren en el caso
que el nombre y apellidos tengan menos de 100 caracteres. Por
ejemplo si el nombre y apellidos ocupan 50 caracteres, los otros
50 se llenarán de espacios en blanco y eso no
afectará el programa porque el usuario no percibirá
ninguna diferencia visualmente.

current->nombreyapellidos[i]=' ';//En cada
iteración se llena una posición de un espacio en
blanco, de modo que luego de las 100 iteraciones del ciclo "for",
las 100 posiciones estarán llenas de espacios en
blanco.

//Con las próximas 2
líneas se llena cada posición del arreglo tipo
"char" con datos tomados del textBox3 y pasados de "String" a
"char".

for(int
i=0;i<textBox3->Text->Length;i++)

current->nombreyapellidos[i] =
textBox3->Text[i];

//Para que el apuntador del nodo
recién creado (que se iría a posicionar como
último nodo de la fila) apunte al primer nodo de la fila
(el "header"), pues se está trabajando con el modelo
"Circular Doblemente Ligado".

current->siguiente = header;

//Las 4 líneas anteriores han
sido para crear un nuevo nodo. Las 4 líneas siguientes
serán para posicionar el nodo recién creado en la
última posición de la fila, de modo que sea el
último nodo de todos.

temporary = header;//Un
apuntador llamado "temporary" apunta al apuntador "header", para
comenzar a hacer los procesos que
se deseen desde el primer nodo de la fila, que es lo que apunta
el "header".

while
(temporary->siguiente != header)//Cuando "temporary->siguiente" sea igual a
"header", significa que ya nos encontramos en el último
nodo de la fila, pues el último nodo de la fila es el que
apunta al header (por estar trabajando con el modelo "Circular
Doblemente Ligado"). Mientras eso no haya sucedido, se debe
seguir avanzando hasta llegar al último nodo, que es el
que se quiere encontrar debido a que después de ese nodo
es que se va a agregar el nuevo nodo y así quedará
como el último nodo de todos o el último de la
fila.

temporary = temporary->siguiente;//Con esto se avanza hacia el siguiente nodo siempre
que la condición del while todavía se
cumpla.

temporary->siguiente = current;//Estando fuera del while, debido a que ya se
detectó cuál es el último nodo, ahora se
agrega un nuevo nodo ubicado en la última posición,
es decir como último nodo de toda la fila.

current->anterior = temporary;//Luego de haber agregado un nuevo nodo, se
especifíca cuál es el penúltimo nodo, lo
cual será importante saber para cuando se programe la
navegación hacia atrás, es decir irse desplazando
de uno en uno hacia nodos anteriores hasta llegar al primero de
todos.

header->anterior = current;//Para que cuando esté en el primer nodo de
todos, que el nodo anterior sea el último nodo de todos,
que dos líneas arriba se acaba de programar cuál
será el último nodo de todos
("temporary->siguiente = current;"). Esto tomando en cuenta
que se está trabajando con el modelo "Circular Doblemente
Ligado", de modo que si está en el último nodo de
todos y quiere irse al siguiente, se iría al primer nodo
de todos; y si está en el primer nodo de todos y quiere
irse al anterior, se iría al último nodo de
todos.

totaldenodos+=1;//Le suma 1
al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}

}

Código del Botón
Anterior

private: System::Void
button3_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Anterior".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha reado todavía
ningún nodo), que el programa simplemente no haga
nada.

current = current->anterior;//El nodo anterior al actual pasa a ser el nuevo nodo
actual.

//Las siguientes cinco líneas
muestran en pantalla el nodo anterior, que gracias a lo que se
hizo en la línea anterior se convierte en nuestro nuevo
nodo actual.

textBox1->Text =
Convert::ToString(current->edad);

textBox2->Text =
Convert::ToString(current->salario);

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for (int i=0; i<100; i++)//Hace 100 iteraciones, pues es el máximo que se
ha programado que puede tener de posiciones el arreglo tipo
"char" donde se almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//En
cada iteración va concatenando, de modo que toma las
posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

}

}

Código del Botón
Siguiente

private: System::Void
button4_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Siguiente".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

current = current->siguiente;//El nodo siguiente al actual pasa a ser el nuevo nodo
actual.

//Las siguientes cinco líneas
muestran el nodo siguiente, que gracias a lo que se hizo en la
línea anterior se convierte en nuestro nuevo nodo
actual.

textBox1->Text =
Convert::ToString(current->edad);

textBox2->Text =
Convert::ToString(current->salario);

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//En
cada iteración va concatenando, de modo que toma las
posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

}

}

Código del Botón Eliminar Primer
Nodo

private: System::Void
button5_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Eliminar Primer Nodo".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

if (header->siguiente !=
header){//Para que elimine
únicamente cuando el "header" tenga un nodo siguiente que
no sea precisamente el "header" mismo (pues se está
trabajando con el modelo "Circular Doblemente Ligado"). En caso
contrario (si el siguiente del "header" fuera él mismo)
significa que la fila tiene un solo nodo y por lo tanto no se
tendría que eliminar, por lo cual no se entraría al
"if".

temporary = header;//Debido
a que se quiere eliminar el primer nodo de la fila (que
sería el "header"), en una variable llamada "temporary" se
almacena el "header".

header = header->siguiente;//El nuevo "header" será el segundo nodo de la
fila, pues el primer nodo de la fila se
eliminará.

header->anterior = 0;//Se desconecta el segundo nodo de la fila (que
pasará a ser nuestro nuevo primer nodo de la fila o
"header") del primer nodo de la fila (que es el que se va a
eliminar).

header->anterior =
temporary->anterior;//Se conecta
el segundo nodo de la fila (que pasará a ser nuestro
primer nodo de la fila o "header") con el último nodo de
la fila, pues se está trabajando con el modelo "Circular
Doblemente Ligado".

temporary->siguiente = 0;//Se desconecta el primer nodo de la fila (que
será eliminado) del segundo nodo de la fila (que
pasará a ser el primer nodo de la fila).

temporary->anterior = 0;//Se desconecta el primer nodo de la fila (que
será eliminado) del último nodo de la fila (pues
por estar trabajando con el modelo "Circular Doblemente Ligado",
el primer nodo de la fila siempre va conectado al último
nodo de la fila).

delete(temporary);//Se elimina el primer nodo de la fila, pero
nótese que antes de eliminarlo primero se
desconectó y se hicieron las conexiones correspondientes
mediante las líneas anteriores de código para el
botón Eliminar.

current = header;//Para que
cuando se haga clic en el botón Anterior o Siguiente no
tome como nodo actual el nodo que se acaba de eliminar, sino que
tome como nodo actual el nuevo "header".

header->anterior->siguiente =
header;//Esto se hace para que el
último nodo no quede apuntando al nodo recién
eliminado, sino que el último nodo de todos quede
apuntando al nuevo header.

textBox1->Text =
Convert::ToString(current->edad);//Imprime la edad del nuevo nodo "header" (primer nodo
de la fila), pues lo que se eliminó es el que era antes el
"header".

textBox2->Text =
Convert::ToString(current->salario);//Imprime el salario del nuevo "header" (primer nodo de
la fila), pues lo que se eliminó es el que era antes el
"header".

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//Imprime
el nombre y apellidos del nuevo nodo "header" (primer nodo de la
fila), pues lo que se eliminó es el que era antes el
"header". En cada iteración va concatenando, de modo que
toma las posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

totaldenodos-=1;//Le resta
1 al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}

}

}

Código del Botón Agregar Nodo
en la Posición k

private: System::Void
button6_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Agregar Nodo en la Posición
k".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

if
(Convert::ToDouble(textBox4->Text) <=
Convert::ToDouble(textBox6->Text)){//Si la posición "k" es igual o menor que el
número total de nodos existente en la fila, se comienzan a
hacer los procesos correspondientes. De lo contrario el programa
no hace nada.

//Se determina hacia dónde va a
apuntar la variable apuntadora llamada "current".

current = new
nodo;//Se le puede poner
"header = new struct nodo;", pero no es necesario poner la
palabra "struct".

//Con las próximas 6
líneas se llenan de información o datos los
espacios de memoria a los que se encuentra apuntando el
apuntador.

current->edad =
Convert::ToInt64(textBox1->Text);

current->salario =
Convert::ToDouble(textBox2->Text);

for(int i=0;i<100;i++)//Para llenar cada posición del arreglo de
espacios en blanco y que así imprima espacios en blanco en
vez de cualquier otra cosa en los espacios que sobren en el caso
que el nombre y apellidos tengan menos de 100 caracteres. Por
ejemplo si el nombre y apellidos ocupan 50 caracteres, los otros
50 se llenarán de espacios en blanco y eso no
afectará el programa porque el usuario no percibirá
ninguna diferencia visualmente.

current->nombreyapellidos[i]=' ';//En cada
iteración se llena una posición de un espacio en
blanco, de modo que luego de las 100 iteraciones del ciclo "for",
las 100 posiciones estarán llenas de espacios en
blanco.

//Con las próximas 2
líneas se llena cada posición del arreglo tipo
"char" con datos tomados del textBox3 y pasados de "String" a
"char".

for(int
i=0;i<textBox3->Text->Length;i++)

current->nombreyapellidos[i] =
textBox3->Text[i];

temporary = header;//Con
esto se podrá comenzar a contar desde el primer nodo de
la fila, que es el "header".

if
(Convert::ToInt64(textBox4->Text)==1){//En
caso que "k" valga 1, es decir que se quiera agregar un nodo en
la primera posición y que pase a ser el nuevo "header"
(primer nodo de todos en la fila) de la fila.

current->siguiente = header;//"current" es el nodo que se está
agregando/creando como nuevo "header". Debido a que el que es
"header" dejará de serlo y pasará a ser el segundo
nodo de la fila, entonces el nuevo nodo ("current") tendrá
como su nodo siguiente al que hasta este momento es
todavía "header".

current->anterior =
header->anterior;//"current" es
el nodo que se está agregando/creando como nuevo "header".
El nuevo "header" tendrá como nodo anterior al mismo nodo
que el nodo que dejará de ser "header" tiene como
anterior.

header->anterior = current;//El "header" pasará a ser segundo de la fila
porque el nodo "current" se convertirá en nuestro nuevo
"header". Entonces el que todavía es "header" (y que
pasará a ser segundo nodo de la fila) tendrá como
nodo anterior a "current" (que será nuestro nuevo
"header").

current->anterior->siguiente =
current;//"current->anterior->siguiente" hace referencia
al nodo siguiente del último nodo de la fila. En pocas
palabras significa que el último nodo de la fila
("current->anterior" es el último nodo de la fila, pues
por estar trabajando con el model "Circular Doblemente Ligado",
"current" será nuestro nuevo "header" y tendrá como
anterior al último nodo de toda la fila) tendrá
como nodo siguiente al primer nodo de toda la fila, que es
"current", que pasará a ser el nuevo "header".

header = current;//Con esto
se especifica que nuestro nuevo "header" (primer nodo de toda la
fila) es "current".

totaldenodos+1;//Le suma 1
al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}else{//En
caso qe "k" no valga 1, es decir que se quiera agregar un nodo en
una posición en la que el nuevo nodo no pasará a
ser el "header" (primer nodo de la fila) de la fila.

for
(int i=1;
i<Convert::ToInt64(textBox4->Text); i++)//Si "k" vale 4, se harían 3 iteraciones; si "k"
vale 5 se hacen 4 iteraciones; y así sucesivamente. Si el
usuario elije "k = 3", entonces si se agregara un nuevo nodo en
la posición "k", se crearía y se iría a
ubicar en la posición 3, de manera que el que era 3
pasaría a ser el 4, el que era 4 pasaría a ser 5 y
así sucesivamente.

temporary = temporary->siguiente;//En la última iteración del ciclo "for",
en "temporary" se capturaría el nodo "k", que es donde se
desea ir a ubicar el nuevo nodo recién creado, y correr
este nodo "temporary" una posición adelante, cuidando
siempre de conectar correctamente cada nodo con su respectivo
nodo anterior y siguiente.

current->siguiente = temporary;//Estando fuera del ciclo "for", el nodo siguiente del
nodo recién creado sería "temporary". Por ejemplo,
si el usuario decidió crear/agregar el nuevo nodo en la
posición 3, entonces "temporary" almacenaría el
nodo que antes estaba en la posición 3 pero que ahora
tendrá que pasar a la posición 4, y con esto se
conecta el nodo 3 (recién creado/agregado) con el nodo 4
(que se tuvo que adelantar una posición, pues estaba en la
posición 3 y pasaría a la posición
4).

current->anterior =
temporary->anterior;//El anterior
del nodo recién creado/agregado sería el que era
anterior del "temporary". Por ejemplo, si el usuario
decidió crear/agregar el nuevo nodo en la posición
3, entonces "temporary" tenía como anterior el nodo 2,
pero ahora el nodo 2 pasará a ser el anterior del nuevo
nodo recién creado en la posición 3.

temporary->anterior = current;//El nodo que fue desplazado un espacio hacia adelante
apunta hacia el nuevo nodo recién creado. Por ejemplo si
el nodo recién creado/agregado se fue a ubicar a la
posición 3, el nodo que estaba en la posición 3
pasa a la posición 4 y apunta como su nodo anterior hacia
la posición 3 (que sería "current" el nodo 3 en
este caso o en este ejemplo).

current->anterior->siguiente =
current;//El nodo que está
atrás del nodo recién creado debe apuntar hacia el
nodo recién creado como su nodo siguiente y no hacia el
nodo al que estaba apuntando antes de la aparición de este
nuevo nodo que acaba de llegar. Por ejemplo, el nodo 2 estaba
apuntando al nodo 3, pero cuando llega el nuevo nodo en la
posición 3, el nodo que era el 3 pasa a ser el nodo 4 y el
nodo 2 debe apuntar hacia el nuevo nodo que se vino a ubicar en
la posición 3 y no hacia el que actualmente sería
el nodo 4.

totaldenodos+=1;//Le suma 1
al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}

}

}

}

Código del Botón Eliminar
Nodo en la Posición k

private: System::Void
button7_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Eliminar Nodo en la Posición
k".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

if
(Convert::ToDouble(textBox4->Text) <=
Convert::ToDouble(textBox6->Text)){//Si la posición "k" es igual o menor que el
número total de nodos existente en la fila, se comienzan a
hacer los procesos correspondientes. De lo contrario el programa
no hace nada.

if
(header->siguiente != header){//Para que elimine únicamente cuando el "header"
(primer nodo de la fila) tenga un nodo siguiente que no sea
precisamente el "header" mismo (pues se está trabajando
con el modelo "Circular Doblemente Ligado"). En caso contrario
(si el siguiente del "header" fuera él mismo) significa
que la fila tiene un solo nodo y por lo tanto no se
tendría que eliminar, por lo cual no se entraría al
"if".

temporary = header;//Con
esto se podrá comenzar a contar desde el primer nodo de la
fila, que es el "header".

for
(int i=1;
i<Convert::ToInt64(textBox4->Text); i++)//Si "k" vale 3, se harían 2 iteraciones; si "k"
vale 4 se harían 3 iteraciones; y así
sucesivamente. En caso que "k" valiera 3 significa que lo que se
desea hacer es eliminar el nodo 3, de modo que el ciclo "for"
servirá para identificar el nodo que se desea
eliminar.

temporary = temporary->siguiente;//En la última iteración del ciclo "for",
en "temporary" se capturaría el nodo "k" que es el que se
desea eliminar.

if (temporary
== header){//En caso que lo que se
quiera eliminar sea el primer nodo de la fila (es decir el
"header").

if
(header->siguiente != header){//Para que elimine únicamente cuando el "header"
(primer nodo de la fila) tenga un nodo siguiente que no sea
precisamente el "header" mismo (pues se está trabajando
con el modelo "Circular Doblemente Ligado". En caso contrario (si
el siguiente del "header" fuera él mismo) significa que la
fila tiene un solo nodo y po rlo tanto no se tendráa que
eliminar, por lo cual no se entraría al "if".

header = header->siguiente;//El nuevo "header" será el segundo nodo de la
fila, pues el primer nodo de la fila se
eliminará.

header->anterior = 0;//Se desconecta el segundo nodo de la fila (que
pasará a ser nuestro nuevo primer nodo de la fila o
"header") del primer nodo de la fila (que es el que se va a
eliminar).

header->anterior =
temporary->anterior;//Se conecta
el segundo nodo de la fila (que pasará a ser nuestro
primer nodo de la fila o "header") con el último nodo de
la fila, pues se está trabajando con el modelo "Circular
Doblemente Ligado".

temporary->siguiente = 0;//Se desconecta el primer nodo de la fila (que
será eliminado) del segundo nodo de la fila (que
pasará a ser el primer nodo de la fila).

temporary->anterior = 0;//Se desconecta el primer nodo de la fila (que
será eliminado) del último nodo de la fila (pues
por estar trabajando con el modelo "Circular Doblemente Ligado",
el primer nodo de la fila siempre va conectado al último
nodo de la fila).

delete(temporary);//Se elimina el primer nodo de la fila, pero
nótese que antes de eliminarlo primero se
desconectó y se hicieron las conexiones correspondientes,
así como también se determinó quién
será el nuevo "header".

current= header;//Para que
cuando se haga clic en el botón Anterior o Siguiente no
tome como nodo actual el nodo que se acaba de eliminar, sino que
tome como nodo actual el "header" actual.

header->anterior->siguiente =
header;//Esto se hace para que el
último nodo no quede apuntando al nodo recién
eliminado, sino que el último nodo de todos quede
apuntando al nuevo header.

textBox1->Text =
Convert::ToString(current->edad);//Imprime la edad del nodo actual (el "header" o primer
nodo de la fila).

textBox2->Text =
Convert::ToString(current->salario);//Imprime el salario del nodo actual (el "header" o
primer nodo de la fila).

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//Imprime
el nombre y apellidos del nodo actual (el "header" o primer nodo
de la fila). En cada iteración va concatenando, de modo
que toma las posiciones tipo "char" y las va poniendo como una
sola palabra/palabras de tipo "String" para ir a imprimir al
textBox.

totaldenodos-=1;//Le resta
1 al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}

}else{//En
caso que no sea el "header" el que se quiere eliminar, es decir
que "temporary" sea diferente de "header" o "temporary !=
header".

temporary->anterior->siguiente =
temporary->siguiente;//"temporary" es el nodo que se quiere eliminar, es
decir el nodo "k". Supongamos que "temporary" es el nodo 3, con
esta línea se logra que el nodo siguiente del nodo 2 pase
a ser el nodo 4 (pues el nodo 3 se va a eliminar y el nodo 4
pasará a ser el nodo 3).

temporary->siguiente->anterior =
temporary->anterior;//"temporary"
es el nodo que se quiere eliminar, es decir el nodo "k".
Supongamos que "temporary" es el nodo 3, con esta línea se
logra que el nodo anterior del nodo 4 pase a ser el nodo 2 (pues
el nodo 3 se va a eliminar y el nodo 4 pasará a ser el
nodo 3).

temporary->siguiente = 0;//Se desconecta el nodo que se va a eliminar del nodo
siguiente al que apuntaba.

temporary->anterior = 0;//Se desconecta el nodo que se va a eliminar del nodo
anterior al que apuntaba.

delete(temporary);//Se elimina el nodo correspondiente a la
posición "k" determinada por el usuario.

current = header;//Para que
cuando se haga clic en el botón Anterior o Siguiente no
tome como nodo actual el nodo que se acaba de eliminar, sino que
tome como nodo actual el "header" actual.

textBox1->Text =
Convert::ToString(current->edad);//Imprime la edad del nodo actual (el "header" o primer
nodo de la fila).

textBox2->Text =
Convert::ToString(current->salario);//Imprime el salario del nodo actual (el "header" o
primer nodo de la fila).

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//Imprime
el nombre y apellidos del nodo actual (el "header" o primer nodo
de la fila). En cada iteración va concatenando, de modo
que toma las posiciones tipo "char" y las va poniendo como una
sola palabra/palabras de tipo "String" para ir a imprimir al
textBox.

totaldenodos-=1;//Le resta
1 al número total de nodos que hay en la fila.

textBox6->Text =
Convert::ToString(totaldenodos);//Imprime en el textBox6 el número total de
nodos que hay en la fila.

}

}

}

}

}

private: System::Void
groupBox3_Enter(System::Object^ sender, System::EventArgs^ e)
{

}

Código del Botón Ir al Primer Nodo
de Todos

private: System::Void
button8_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Ir al Primer Nodo de Todos".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

current = header;//El
primer nodo de todos ("header") pasa a ser el actual.

//Las siguientes cinco
líneas muestran en pantalla el nodo anterior, que gracias
a lo que se hizo en la línea anterior se convierte en
nuestro nuevo nodo actual.

textBox1->Text =
Convert::ToString(current->edad);

textBox2->Text =
Convert::ToString(current->salario);

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//En
cada iteración va concatenando, de modo que toma las
posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

}

}

Código del Botón Ir al
Último Nodo de Todos

private: System::Void
button9_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Ir al Último Nodo de
Todos".

if (header !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

current = header->anterior;//El último nodo de todos (el nodo anterior al
"header", pues se está trabajando con el modelo "Circular
Doblemente Ligado") pasa a ser el actual.

//Las siguientes dos líneas
muestran en pantalla el nodo anterior, que gracias a lo que se
hizo en la línea anterior se convierte en nuestro nuevo
nodo actual.

textBox1->Text =
Convert::ToString(current->edad);

textBox2->Text =
Convert::ToString(current->salario);

textBox3->Text="";//Limpia
el textBox3 para que no quede nada de procesos
anteriores.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox3->Text +=
Char::ToString(current->nombreyapellidos[i]);//En
cada iteración va concatenando, de modo que toma las
posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

}

}

Código del Evento
Form1_Load

private: System::Void
Form1_Load(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Form1_Load, es decir cuando se cargue el formulario (siempre que
se ejecute el programa).

textBox4->Text = "1";//Para
que al cargar el formulario ya aparezca el número 1 en el
textBox4 como valor de "k",
por si al usuario se le olvida poner un número ahí,
que no quede vacío.

}

 

Jaime Oswaldo Montoya Guzmán,

estudiante de tercer año de Ingeniería en Sistemas
Informáticos.

Santa Ana, 27 de mayo de 2007

Universidad Católica de Occidente

El Salvador

 

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter